/*
 * @Author: 13177709051 3506463075@qq.com
 * @Date: 2024-11-05 22:11:16
 * @LastEditors: 13177709051 3506463075@qq.com
 * @LastEditTime: 2024-11-14 11:57:52
 * @FilePath: /linux31/udp_echo_server/InetAddr.hpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#pragma once

#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

class InetAddr                          
{
private:
    void ToHost(const struct sockaddr_in &addr)
    {
        _port = ntohs(addr.sin_port);
        _ip = inet_ntoa(addr.sin_addr);
    }

public:
    InetAddr(const struct sockaddr_in &addr):_addr(addr)
    {
        ToHost(addr);
    }
    std::string Ip()
    {
        return _ip;
    }
    uint16_t Port()
    {
        return _port;
    }
    ~InetAddr()
    {
    }

private:
    std::string _ip;
    uint16_t _port;
    struct sockaddr_in _addr;
};



// InetAddr 类它封装了网络地址 (IP 端口), 以及提供了访问这些信息的方法, 该类通过了 struct sockaddr_in 来存储 IP 地址和端口, 并提供了转换和获取信息的功能

// 成员变量 :
// _ip : 存储 IP 地址, 使用 std::string 类型, 因为 IP 地址通常表示一个点分十进制的字符串
// _port : 存储端口号, 使用 uint16_t 类型, 端口号是一个16位的无符号整数
// _addr : 存储原始的 struct sockaddr_in 结构体, 它包含了 IP 地址和端口信息

// ToHost():
// ToHost() : 将 struct sockaddr_in 中的网络字节数据转换为主机字节序, 并提取 IP 和端口.
// ntohs(addr.sin_port) : 将网络字节序的端口号转换为主机字节序
// inet_ntoa(addr.sin_addr) : 将网络字节序的 IP 地址转换为点分十进制的字符串的形式 

// 构造函数 : 
// 构造函数 : 接受一个 struct sockaddr_in 类型的参数, 表示网络地址
// 构造函数初始化 _addr 成员, 存储传入的地址
// 然后调用 ToHost() 方法来从该地址中提取 IP 和端口, 并进行转换 
// Ip() && Port()
// Ip() : 返回存储的 IP 地址, 类型为 std::string
// Port() : 返回存储的端口号, 类型为 uint16_t 

// 析构函数 :
// 由于没有动态分配资源, 所以没有必要进行额外的清理工作~